// btyeshift.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

	unsigned char Byte1;
	unsigned char Byte2;

	Byte1 = 0;
	Byte2 = 255;

	// Bitwise OR 
	// Byte1 contains 00000000
	// Byte2 contains 11111111
	//                -------- OR
	//         Byte1  00000000
	Byte1 = Byte1 | Byte2;

	cout << "Byte value Byte1: ";
	printf("%d", Byte1);
	cout << endl;

	cout << "Byte value Byte2: ";
	printf("%d", Byte2);
	cout << endl;


	Byte1 = 4;
	Byte2 = 16;

	// Bitwise AND 
	// Byte1 contains 00000100
	// Byte2 contains 00010000
	//                -------- AND
	//         Byte1  00011000
	Byte1 = Byte1 | Byte2;

	cout << "Byte value Byte1: ";
	printf("%d", Byte1);
	cout << endl;

	cout << "Byte value Byte2: ";
	printf("%d", Byte2);
	cout << endl;

	Byte1 = 12;
	Byte2 = 60;

	// Bitwise XOR 
	// Byte1 contains 00001100
	// Byte2 contains 00111100
	//                -------- XOR
	//         Byte1  00110000
	Byte1 = Byte1 ^ Byte2;

	cout << "Byte value Byte1: ";
	printf("%d", Byte1);
	cout << endl;

	cout << "Byte value Byte2: ";
	printf("%d", Byte2);
	cout << endl;

	Byte1 = 240;
	Byte2 = 0;
	
	// Bitwise Complement 
	// Byte1 contains 11110000~
	// Byte2 contains 00000000
	//                -------- Complement
	//         Byte2  00001111
	Byte2 = ~Byte1;

	cout << "Byte value Byte1: ";
	printf("%d", Byte1);
	cout << endl;

	cout << "Byte value Byte2: ";
	printf("%d", Byte2);
	cout << endl;


	Byte1 = 15;
	Byte2 = 0;

	// Bitwise shift left 
	// Byte1 contains 00001111
	// Byte2 contains 00000000
	//                -------- <<
	//         Byte2  11110000
	Byte2 = Byte1 << 4;

	cout << "Byte value Byte1: ";
	printf("%d", Byte1);
	cout << endl;

	cout << "Byte value Byte2: ";
	printf("%d", Byte2);
	cout << endl;

	Byte1 = 144;
	Byte2 = 0;

	// Bitwise shift left 
	// Byte1 contains 10010000
	// Byte2 contains 00000000
	//                -------- <<
	//         Byte2  00001001
	Byte2 = Byte1 >> 4;

	cout << "Byte value Byte1: ";
	printf("%d", Byte1);
	cout << endl;

	cout << "Byte value Byte2: ";
	printf("%d", Byte2);
	cout << endl;

	// Each byte contains 8 bits and a maximum numurical value of 255
	unsigned char ByteInt[4];
	ByteInt[0] = 0;
	ByteInt[1] = 0;
	ByteInt[2] = 15;
	ByteInt[3] = 15;

	unsigned int Integer = 0;

	// Fill integer with bytes, this way we get a integer value
	// 00000000
	// 00000000
	// 00001111
	// 00001111
	// -------- +
	// 00000000000000000000111100001111 = 3855
	Integer = (ByteInt[0] << 24) +
			   (ByteInt[1] << 16) +
			   (ByteInt[2] << 8) +
			   ByteInt[3];


	cout << "Integer: ";
	printf("%d", Integer);
	cout << endl;


	return 0;
}

